
package advice.introduction;

import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.IntroductionInterceptor;

/**
 * Introduciotn 是個特別的 Advice, 從使用者的角度來看, 它影響了目標物件的行為定義, 直接增加了目標物件的職責(具體來說就是增加了可操作的方法), 例如:讓某個已定義好的物件, 在不修改該物件之類別檔的情況下, 卻可以增加一些額外的操作方法到物件之上.
 * 
 * @author Eric.Kao(gau168.gau@msa.hinet.net)
 * @version 1.0
 * @company E885 Group
 * @copyright Copyright (c) 2001-2008
 */

public class OtherSpeaker implements IntroductionInterceptor, OtherHelloInterface
{
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
	 */
	public Object invoke( MethodInvocation methodInvocation ) throws Throwable
	{
		// 如果呼叫的方法來自OtherInterface介面的定義
		if( implementsInterface( methodInvocation.getMethod().getDeclaringClass() ) )
			// 呼叫執行額外加入（mixin）的行為
			return methodInvocation.getMethod().invoke( this, methodInvocation.getArguments() );
		else
			return methodInvocation.proceed();
	}

	/*
	 * 是否 implement OtherInterface interface
	 * 
	 * @see org.springframework.aop.DynamicIntroductionAdvice#implementsInterface(java.lang.Class)
	 */
	public boolean implementsInterface( Class clazz )
	{
		return clazz.isAssignableFrom( OtherHelloInterface.class );
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see advice.introduction.OtherInterface#sayOther()
	 */
	public void sayOther( String name )
	{
		System.out.println( "執行另一個邏輯, say other:" + name );
	}

}
